package com.pai4j.message.subscription;

import com.pai4j.message.model.MessageContext;
import com.pai4j.message.model.SubscriptionConfig;

import java.util.List;

/**
 * 消息订阅接口
 * 管理用户的消息订阅
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
public interface MessageSubscription {

    /**
     * 订阅消息
     *
     * @param config 订阅配置
     * @return 订阅ID
     */
    String subscribe(SubscriptionConfig config);

    /**
     * 取消订阅
     *
     * @param subscriptionId 订阅ID
     */
    void unsubscribe(String subscriptionId);

    /**
     * 获取用户的所有订阅
     *
     * @param userId 用户ID
     * @return 订阅配置列表
     */
    List<SubscriptionConfig> getUserSubscriptions(String userId);

    /**
     * 获取订阅配置
     *
     * @param subscriptionId 订阅ID
     * @return 订阅配置
     */
    SubscriptionConfig getSubscription(String subscriptionId);

    /**
     * 更新订阅配置
     *
     * @param config 订阅配置
     */
    void updateSubscription(SubscriptionConfig config);

    /**
     * 检查用户是否订阅了该消息
     *
     * @param userId  用户ID
     * @param context 消息上下文
     * @return 是否订阅
     */
    boolean isSubscribed(String userId, MessageContext context);

    /**
     * 通知订阅者
     *
     * @param context 消息上下文
     */
    void notifySubscribers(MessageContext context);

    /**
     * 获取消息的订阅者列表
     *
     * @param context 消息上下文
     * @return 订阅者用户ID列表
     */
    List<String> getSubscribers(MessageContext context);
}

